﻿#ifndef STACK_QUEUE_H_
#define STACK_QUEUE_H_

#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<list>


//基础实现
//1）队列的介绍	
// 先进先出，只能尾进，头出
//peek	pop	push	empty
	//链表实现
	// 环形 n 长 T 数组实现
	//一般直接求余
	//修改为越界回到零 降低计算损耗
	//数据过量/为空 则返回入队失败或出队失败


/*设计你的循环队列实现。
	循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。
	它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。
	在一个普通队列里，一旦一个队列满了，我们就不能插入下一个元素，即使在队列前面仍有空间。
	但是使用循环队列，我们能使用这些空间去存储新的值。
	你的实现应该支持如下操作：
	MyCircularQueue(k): 构造器，设置队列长度为 k 。
	Front: 从队首获取元素。如果队列为空，返回 -1 。
	Rear: 获取队尾元素。如果队列为空，返回 -1 。
	enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
	deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
	isEmpty(): 检查循环队列是否为空。
	isFull(): 检查循环队列是否已满。*/
	// 测试链接 : https://leetcode.cn/problems/design-circular-queue/



//2）栈的介绍	
// 先进后出，一个开口，头压 头弹
//top	pop	push empty
	//栈的数组实现
//未给定数据量	通过vector实现
//给定数据量不会超过 n  int数组实现



//栈与队列的相互实现
//队列
//仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作（push、pop、peek、empty）：
//实现 MyQueue 类：
//void push(int x) 将元素 x 推到队列的末尾
//int pop() 从队列的开头移除并返回元素
//int peek() 返回队列开头的元素	为空则 -1
//boolean empty() 如果队列为空，返回 true ；否则，返回 false
// 测试链接 : https://leetcode.cn/problems/implement-queue-using-stacks/




//栈
//请你仅使用两个队列实现一个后入先出（LIFO）的栈，并支持普通栈的全部四种操作（push、top、pop 和 empty）。
//实现 MyStack 类：
//void push(int x) 将元素 x 压入栈顶。
//int pop() 移除并返回栈顶元素。
//int top() 返回栈顶元素。
//boolean empty() 如果栈是空的，返回 true ；否则，返回 false 。
// // 测试链接 : https://leetcode.cn/problems/implement-stack-using-queues/


// 最小栈
//设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
//实现 MinStack 类:
//MinStack() 初始化栈对象。
//void push(int val) 将元素val推入堆栈。
//void pop() 删除栈顶部的元素。
//int top() 获取栈顶部的元素。
//int getMin() 获取栈中的最小元素。
// 测试链接 : https://leetcode.cn/problems/min-stack/



//双端队列(deque)
//1）双端队列的介绍
/*
实现 MyCircularDeque 类:
MyCircularDeque(int k) ：构造函数,双端队列最大为 k 。
boolean insertFront()：将一个元素添加到双端队列头部。 如果操作成功返回 true ，否则返回 false 。
boolean insertLast() ：将一个元素添加到双端队列尾部。如果操作成功返回 true ，否则返回 false 。
boolean deleteFront() ：从双端队列头部删除一个元素。 如果操作成功返回 true ，否则返回 false 。
boolean deleteLast() ：从双端队列尾部删除一个元素。如果操作成功返回 true ，否则返回 false 。
int getFront() )：从双端队列头部获得一个元素。如果双端队列为空，返回 -1 。
int getRear() ：获得双端队列的最后一个元素。 如果双端队列为空，返回 -1 。
boolean isEmpty() ：若双端队列为空，则返回 true ，否则返回 false  。
boolean isFull() ：若双端队列满了，则返回 true ，否则返回 false 。
*/
//2）双端队列用双链表的实现

//3）双端队列用固定数组的实现
// 测试链接 : https://leetcode.cn/problems/design-circular-deque/
#endif STACK_QUEUE_H_
